此处主要用于归纳Scala中的一些常见,但不易理解的术语 以及阅读过程中的一些重要概念
first-class function
头等函数trait 特质 类似 Java 的接口,但可以有方法实现及字段。能够让不同用途的类包装不同的特质,类似多重继承,但避免了多重继承中的”菱形继承“问题。 Java中一个类实现了某个接口,而Scala中则是混入(mix)了某种特质
companion object 伴生对象:当单例对象与类共享相同名称时,该对象为该类的伴生对象,可互相访问私有成员
mixin composition 混入组装
literal 字面量 : 即源代码中的一个固定值,直接写在代码中的常量值。如一个整数,一个用双引号括起的字符串等
静态类型 静态类型指的是编译器在compile time执行类型检查,动态类型指的是编译器(虚拟机)在runtime执行类型检查。
type inference 类型推断:让Scala 自动理解忽略的类型
val msg = " Hello, world! "
val msg2 : String = " Hello, world! "
此处没有定义 msg 的类型,但可推断出是字符串
result type 结果类型:函数的返回类型
Unit : 类似 Java 的 void 类型,所有Java中返回void的方法,都会被映射为返回Unit的Scala方法。因此,执行Unit方法并不是为了得到返回值,而是为了其他的运行效果(side effect)。
parameterize 参数化对象,即在初始化对象时,利用参数为它赋值
- 使用值参数化实例,将参数设置在圆括号内:
new java.math.BigInteger("12345")
- 使用类型参数化实例,将参数设置在方括号内:
new Array[String](3)
同时使用值和类型时,先写类型,再写参数
- 使用值参数化实例,将参数设置在圆括号内:
工厂模式 : 减少用new创建对象的方式,用接口形式来返回对象,而把new创建方式封装起来。
uniform access principle 统一访问原则 :客户代码不应因为属性是通过字段,或者通过方法来实现而受到影响。
cons 操作符:
::
,用于把新元素组合到既有列表的最前端。此时由于方法名以冒号结尾,因此调用的是右操作符的方法,而非一般的左操作符。例如:
val twoThree = List(2, 3)
1 :: twoThree // equal to : twoThree.::(1)
// Intialize the list
val oneTwoThree = 1 :: 2 :: 3 :: Nil //Nil is an empty list
//add two lists
val newList = oneTwoThree ::: twoThree
singleton 对象 : 单例对象。用于取代Java中的静态成员,以
object
,而非class
进行类定义。companion object
: 当一个单例对象与它的对应的类共享一个名称时,这个对象就被称为是companion object
伴生对象。伴生对象和它对应的类是各自独立声明的互不不同的代码段。但必须定义在同一个源文件中,访问彼此的私有成员。standalone object
: 不与伴生类共享名称的单例对象。
单例对象可以对父类进行扩展,同时混入新的物质。但是singleton不带参数,因为它不是用new来实例化的,没有机会传递给它实例化参数。可以简单看成是该类的一个静态方法集合。
precondition 先决条件,可以利用
require
方法设置auxiliary constructor,用于在类中生成多个构造器
identifier 标识符
alphanumeric identifier
字母数字标识符: 以字母或下划线开始,后面可以跟字母、数字或下划线operator identifier
操作符标识符mixed identifier
混合式标识符:字母数据组成,后面跟着一个下划线和一个操作符标识符,例如:unary_+
literal identifier
字面量标识符,用`包括的任意字符串,例如:`x`
equantional reasoning
等效推论。 当一个表达式没有副作用时,引用这个表达式和引用这个表达式产生的结果,是等效的,可以随时替换higher-order function
高阶函数,将函数值作为参数传入,形成带其他函数作为参数的函数。currying
柯里化:被应用于多个参数列表,而不仅仅是一个。在调用柯里化的函数时, 实际执行的是一串函数,而非单个函数。loan pattern
借贷模式:由抽象函数A打开资源并借给作为参数的函数B,因此,对于资源的管理全部交给作为控制结构的函数A来完成,而负责业务操作的函数B,则不需要担心资源本身的问题。